<?php

/**
 * MySQL数据操作类
 * 注意：创建DB对象的实例时，并没有建立数据库连接，当执行方法时，才会真正的创建数据库连接。
 * 
 * @author bing.peng
 *
 */
class DB {

	var $dbuser;				// 用户名
	var $dbpassword;			// 密码
	var $dbname;				// 数据库名
	var $dbhost;				// 数据库地址
	var $charset = 'utf8';		// 数据库编码
	var $conn;					// 数据库连接标识
	var $result;				// 执行query命令的结果资源标识 
	
	var $lasting	= FALSE;	// 是否持久连接， 即方法执完成是否立即关闭数据库
	
	function DB($dbuser, $dbpassword, $dbname, $dbhost='localhost') {
		$this->dbuser = $dbuser;
		$this->dbpassword = $dbpassword;
		$this->dbname = $dbname;
		$this->dbhost = $dbhost;
	}
	
	/**
	 * 建立数据库连接
	 * @return void
	 */
	function connect() {
		if( isset( $this->conn ) ) {
			return;
		}
		
		$this->conn = mysql_connect($this->dbhost, $this->dbuser, $this->dbpassword);
		
		if (!$this->conn) {
			show_error('Connect database be fail, Pealse inspect yours database setting!');
		}
		if ( !empty($this->charset) && version_compare(mysql_get_server_info(), '4.1.0', '>=') ) {
			mysql_query("SET NAMES '$this->charset'", $this->conn);
		}		
		
		if( ! mysql_select_db($this->dbname, $this->conn) ) {
			show_error("Can't select name is '$this->dbname' database, Pealse inspect yours database setting");
		}
	}
	
	/**
	 * 执行SQL语句
	 * @param $sql string SQL语句
	 * @return void
	 */
	function execute($sql = NULL) {
		if( ! $sql ) {
			show_error("Excute SQL can't be null");
		}
		$this->connect();
		$this->result = mysql_query($sql, $this->conn);
		if( mysql_error() ) {
			show_error('MySQL Error:' . mysql_errno() . ':' . mysql_error());
		}
		
		if( preg_match("/^\\s*(insert|delete|update|replace) /i", $sql) ) {
			$this->rows_affected = mysql_affected_rows($this->conn);
		} 
	}
	
	/**
	 * 获取插入记录的ID，没有找到相关ID则返回0
	 * @return int
	 */
	function insert_id() {
		return isset($this->insert_id) ? $this->insert_id : 0;
	}
	
	/**
	 * 返回受影响行数，没有相关则返回0
	 * @return int
	 */
	function rows_affected() {
		return isset($this->rows_affected) ? $this->rows_affected : 0;
	}
	
	/**
	 * 插入记录
	 * @param $table string 表名
	 * @param $data array() 数据，以$key=>$value形式
	 * @return int 插入记录的ID
	 */
	function insert($table, $data) {  
        if(!is_array($data)){  
            show_error('data must be array');
        } 
        
        $sql   = "INSERT INTO `{$table}`";
        $fields = $values = array();
        $field = $value = '';
        //遍历记录, 格式化字段名称与值
    	foreach($data as $key => $val) {
        	$fields[] = "`{$table}`.`{$key}`";
            $values[] = is_numeric($val) ? $val : "'{$val}'";
        }
        $field = join(',', $fields);
        $value = join(',', $values);
        unset($fields, $values);
        $sql .= "({$field}) VALUES({$value})";
        $this->execute($sql); 
        return $this->insert_id = mysql_insert_id($this->conn);
	}
	
	/**
	 * 更新记录
	 * @param $table string 表名
	 * @param $data array() 数据，以$key=>$value形式
	 * @param $where string 条件SQL
	 * @return int 返回受影响的记录数
	 */
	function update($table, $data, $where=NULL) {
        if(!is_array($data)){  
            show_error('data must be array');
        }  
        
        $sql = "UPDATE `{$table}` SET ";
		$values = array();
        foreach($data as $key => $val) {
        	$val      = is_numeric($val) ? $val : "'{$val}'";
            $values[] = "`{$table}`.`{$key}` = {$val}";
        }
      	$value = join(',', $values);
      	
      	$sql = $sql . $value;
      	if( !empty($where) ) {
      		$sql .= " WHERE {$where}";
      	}
        
        $this->execute($sql);
        return $this->rows_affected();
	}
	
	/**
	 * 根据条件删除记录
	 * @param $table string 表名
	 * @param $where string 条件SQL
	 * @return int 返回受影响的记录数
	 */
	function delete($table, $where=NULL) {
		$sql = "DELETE FROM `{$table}`";
		if( !empty($where) ) {
			$sql .= " WHERE {$where}";
		}
		$this->execute( $sql );
		return $this->rows_affected();
	}
	
	/**
	 * 根据ID获取记录（一条记录），以数组（一维数组）形式返回
	 * 注意：只有当表中主键字段为'id'时可用
	 * @param $table string 表名
	 * @param $id int
	 * @return array()
	 */
	function find_by_id($table, $id) {
		return $this->find_row("SELECT * FROM `{$table}` WHERE id={$id}");
	}
	
	/**
	 * 获取表中所有记录数，如果没有记录则返回0
	 * @param $table string 表名
	 * @return int
	 */
	function count($table, $where=NULL) {
		$sql = "SELECT count(*) FROM {$table}";
		if( !empty($where) ) {
			$sql .= "WHERE {$where}";
		}
		$var = $this->find_var( $sql );
		return ($var == FALSE) ? 0 : $var;
	}
	
	/**
	 * 获取结果集中指定行和列的值
	 * @param $sql string SQL语句
	 * @param $x int 行值，默认为0
	 * @param $y int 列值，默认为0
	 * @return var
	 */
	function find_var($sql = NULL, $x = 0, $y = 0) {
		$this->execute( $sql );
		if( $this->result ) {
			$i = 0;
			while( $row = mysql_fetch_row( $this->result ) ) {
				$new_array[$i] = $row;
				$i++;
			}
		}
		return isset($new_array[$x][$y]) ? $new_array[$x][$y] : FALSE;
	}
	
	/**
	 * 查询方法，以数组（二维数组）形式返回结果集，如果没有查询结果则返回FALSE
	 * @param $sql string SQL语句
	 * @return array()
	 */
	function find($sql) {
		$this->execute( $sql );
		if( $this->result ) {
			$i = 0;
			while( $row = mysql_fetch_array( $this->result, MYSQL_ASSOC ) ) {
				$new_array[$i] = (array)$row;
				$i++;
			}
		}
		return isset($new_array) ? $new_array : FALSE;
	}
	
	/**
	 * 查询表中的所有记录
	 * @param $table string 表名
	 * @param $where string 查询条件，如： name='zhangsan' and age>=18 
	 * @return unknown_type
	 */
	function find_all($table, $where=NULL) {
		$sql = "SELECT * FROM `{$table}`";
		if( !empty($where) ) {
			$sql .= " WHERE {$where}";
		}
		return $this->find($sql);
	}
	
	/**
	 * 查询方法，仅获取结果集中第一条记录，以数组（一维数组）形式返回，如果没有查询结果返回FALSE
	 * @param $sql
	 * @return array()
	 */
	function find_row($sql = NULL) {
		$this->execute($sql);
		if( $this->result ) {
			$row = mysql_fetch_array( $this->result, MYSQL_ASSOC );
		}
		return isset($row) ? $row : FALSE;
	}
	
	/**
	 * 关闭数据库连接
	 * @return void
	 */
	function close() {
		if( isset( $this->conn ) ) {
			mysql_close($this->conn);
			$this->conn = NULL;
		}
	}
	
}

?>